package com.ailot.cloud.upms.api.controller;

import com.ailot.cloud.base.log.annotation.Oplog;
import com.ailot.cloud.upms.api.service.SysDictService;
import com.ailot.cloud.upms.api.service.SysDictValueService;
import com.ailot.cloud.upms.common.entity.SysDict;
import com.ailot.cloud.upms.common.entity.SysDictValue;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 字典表 前端控制器
 */
@RestController
@AllArgsConstructor
@RequestMapping("/dict")
public class SysDictController {
    private final SysDictService sysDictService;
    private final SysDictValueService sysDictValueService;

    /**
     * 通过ID查询字典信息
     *
     * @param id ID
     * @return 字典信息
     */

    @GetMapping("/{id}")
    @PreAuthorize("hasAuthority('sys:dict:get')")

    public SysDict getById(@PathVariable String id) {
        return sysDictService.getById(id);
    }

    /**
     * 分页查询字典信息
     *
     * @param page 分页对象
     * @return 分页对象
     */

    @GetMapping("/page")
    @PreAuthorize("hasAuthority('sys:dict:page')")
    public Page<SysDict> getDictPage(PageDTO<SysDict> page, SysDict sysDict) {
        return sysDictService.page(page, Wrappers.query(sysDict));
    }

    /**
     * 通过字典类型查找字典
     *
     * @param type 类型
     * @return 同类型字典
     */
    @GetMapping("/type/{type}")
    public List<SysDictValue> getDictByType(@PathVariable String type) {
        return sysDictValueService.list(Wrappers
                .<SysDictValue>query().lambda()
                .eq(SysDictValue::getType, type));
    }

    /**
     * 添加字典
     *
     * @param sysDict 字典信息
     * @return ok、false
     */
    @Oplog("添加字典")
    @PostMapping
    @PreAuthorize("hasAuthority('sys:dict:add')")
    public Boolean save(@Valid @RequestBody SysDict sysDict) {
        return sysDictService.saveOrUpdate(sysDict);
    }

    /**
     * 删除字典，并且清除字典缓存
     *
     * @param id ID
     * @return R
     */
    @Oplog("删除字典")
    @DeleteMapping("/{id}")
    @PreAuthorize("hasAuthority('sys:dict:del')")
    public void removeById(@PathVariable String id) {
        sysDictService.removeDict(id);
    }

    /**
     * 修改字典
     *
     * @param sysDict 字典信息
     * @return ok/false
     */
    @PutMapping
    @Oplog("修改字典")
    @PreAuthorize("hasAuthority('sys:dict:edit')")
    public void updateById(@Valid @RequestBody SysDict sysDict) {
        sysDictService.updateDict(sysDict);
    }

    /**
     * 分页查询
     *
     * @param page         分页对象
     * @param sysDictValue 字典项
     */
    @GetMapping("/item/page")
    public Page<SysDictValue> getSysDictItemPage(Page<SysDictValue> page, SysDictValue sysDictValue) {
        return sysDictValueService.page(page, Wrappers.query(sysDictValue));
    }


    /**
     * 通过id查询字典项
     *
     * @param id id
     * @return R
     */
    @GetMapping("/item/{id}")
    public SysDictValue getDictItemById(@PathVariable("id") String id) {
        return sysDictValueService.getById(id);
    }

    /**
     * 新增字典项
     *
     * @param sysDictValue 字典项
     * @return R
     */
    @Oplog("新增字典项")
    @PostMapping("/item")
    public Boolean save(@RequestBody SysDictValue sysDictValue) {
        return sysDictValueService.saveOrUpdate(sysDictValue);
    }

    /**
     * 修改字典项
     *
     * @param sysDictValue 字典项
     * @return R
     */
    @Oplog("修改字典项")
    @PutMapping("/item")
    public Boolean updateById(@RequestBody SysDictValue sysDictValue) {
        return sysDictValueService.updateDictItem(sysDictValue);
    }

    /**
     * 通过id删除字典项
     *
     * @param id id
     * @return R
     */
    @Oplog("删除字典项")
    @DeleteMapping("/item/{id}")
    public Boolean removeDictItemById(@PathVariable String id) {
        return sysDictValueService.removeDictItem(id);
    }
}
